<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>17. 电话号码的字母组合</title>
</head>
<body>
  <script>
    //     给定一个仅包含数字 2-9 的字符串，返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

    // 给出数字到字母的映射如下（与电话按键相同）。注意 1 不对应任何字母。



    

    // 示例 1：

    // 输入：digits = "23"
    // 输出：["ad","ae","af","bd","be","bf","cd","ce","cf"]
    // 示例 2：

    // 输入：digits = ""
    // 输出：[]
    // 示例 3：

    // 输入：digits = "2"
    // 输出：["a","b","c"]
    

    // 提示：

    // 0 <= digits.length <= 4
    // digits[i] 是范围 ['2', '9'] 的一个数字。
    /**
     * @param {string} digits
     * @return {string[]}
     */
    var letterCombinations = function(digits) {
      if (digits.length == 0) return [];
        const map = {
            2: "abc",
            3: "def",
            4: "ghi",
            5: "jkl",
            6: "mno",
            7: "pqrs",
            8: "tuv",
            9: "wxyz",
        };

        const queue = [];
        queue.push("");
        for (let i = 0; i < digits.length; i++) {//循环数字的每个字符
            const levelSize = queue.length; //当前层的节点个数
            for (let j = 0; j < levelSize; j++) {
                const curStr = queue.shift(); //当前层的字符串
                const letters = map[digits[i]];//获取数字对应的字母字符
                for (const l of letters) {
                    queue.push(curStr + l); //新生成的字符串入列
                }
            }
        }
        return queue; //最后一层生成的字符串就是解
    };

  </script>
</body>
</html>